package com.softhis.rekrutacja.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.softhis.rekrutacja.server.dao.UserDAOImpl;
import com.softhis.rekrutacja.shared.beans.LoginBean;
import com.softhis.rekrutacja.shared.beans.UserSession;
import com.softhis.rekrutacja.shared.dto.UserDTO;
import com.softhis.rekrutacja.shared.services.UserService;

/**
 * @author Sasak
 * 
 *         The server side implementation of the RPC userService.
 */
@Service("userService")
public class UserServiceImpl implements UserService {

	/**
	 * sessions list
	 */
	private static List<UserSession> sessions = new ArrayList<UserSession>();

	/**
	 * log4j
	 */
	private static final Logger logger = Logger.getLogger(UserServiceImpl.class);

	/**
	 * Hibernate DAO class
	 */
	@Autowired
	private UserDAOImpl userDAO;

	
//	 /**
//	 * spring scope session
//	 */
//	@Autowired
//	 private UserSession userSession;

	

	/* (non-Javadoc)
	 * @see com.softhis.rekrutacja.shared.services.UserService#loginUser(java.lang.String, java.lang.String)
	 */
	public LoginBean loginUser(String login, String password) {

		String httpSessionId = null;
		LoginBean loginBean = new LoginBean();
		List<UserDTO> userlistt = this.userDAO.findByLogin(login);
		if (userlistt.size() == 1) {
			UserDTO user = userlistt.get(0);
			if (password.equals(user.getPassword())) {

//				String httpSessionId = SessionProvider.get().getId();

				Date sessionStart = new Date();
				UserSession session = new UserSession(user.getUserId(), httpSessionId, sessionStart);

//				SessionProvider.get().setAttribute("user", user);

				loginBean.setLoggedUser(user);
				loginBean.setSessionId(httpSessionId);

				UserServiceImpl.sessions.add(session);
			}
		}
		return loginBean;
	}

	public void logout(String sessionId) {
		// HttpSession httpSession =
		// this.perThreadRequest.get().getSession(false);
		// String httpSessionId = httpSession == null ? null :
		// httpSession.getId();
		// if (httpSession != null) {
		// if (httpSessionId.equals(sessionId)) {
		// httpSession.invalidate();
		// for (UserSession session : UserServiceImpl.sessions) {
		// if (session.getSessionId().equals(sessionId)) {
		// UserServiceImpl.sessions.remove(session);
		// break;
		// }
		// }
		// }
		// }
	}

	// public void saveOrUpdateUser(UserDTO user) throws Exception {
	// this.userDAO.saveOrUpdate
	// }

	public LoginBean refreshSession() {	
		LoginBean loginBean = new LoginBean();
		String sessionId = null;
		
		// if (httpSession != null) {
		// sessionId = isSessionValid(httpSession.getId());
		// if (sessionId != null) {
		// UserDTO user = (UserDTO) httpSession.getAttribute("user");
		// if (user != null) {
		// loginInfo.setLoggedUser(user);
		// loginInfo.setSessionId(sessionId);
		// }
		// }
		// }
		return loginBean;
	}

	public String isSessionValid(String sessionId) {

		// HttpSession httpSession =
		
		// UserDTO user = httpSession != null ? (UserDTO)
		// httpSession.getAttribute("user") : null;

		// if (user == null) {
		// return null;
		// }

		String isValid = null;
		// String httpSessionId = httpSession.getId();

		// if (httpSessionId.equals(sessionId)) {
		// UserSession userSession = new UserSession();
		// for (UserSession session : UserServiceImpl.sessions) {
		// if (session.getUserId() == user.getUserId()) {
		// userSession = session;
		// break;
		// }
		// }
		//
		// if (userSession.getSessionId() != null) {
		// // check if passed session ID equals the one from server
		// if (!userSession.getSessionId().equals(sessionId)) {
		// return null;
		// }
		// // 5 min
		// Date sessionExpirationTime = new
		// Date(userSession.getStartDate().getTime() + ((1000 * 60) * 5));
		// Date now = new Date();
		// if (now.after(sessionExpirationTime)) {
		// // session expired, invalidate
		// httpSession.invalidate();
		// for (UserSession session : UserServiceImpl.sessions) {
		// if (session.getSessionId().equals(sessionId)) {
		// UserServiceImpl.sessions.remove(session);
		// break;
		// }
		// }
		// return null;
		// } else {
		// for (UserSession session : UserServiceImpl.sessions) {
		// if (session.getSessionId().equals(sessionId)) {
		// session.setSessionId(sessionId);
		// session.setStartDate(now);
		// break;
		// }
		// }
		// return httpSession.getId();
		// }
		//
		// } else {
		// return null;
		// }
		// }
		return isValid;
	}
	
	public UserDTO findUser(int userId) {
		UserDTO user = this.userDAO.find(userId);
		return user;
	}

	public SaveUserCode saveUser(UserDTO user) throws Exception {
		if (loginAlreadyInUse(user.getLogin())) {
			this.userDAO.save(user);
			return SaveUserCode.OK;
		} else
			return SaveUserCode.LOGIN_IN_USE;
	}

	public SaveUserCode updateUser(UserDTO user) throws Exception {
		List<UserDTO> userlist = this.userDAO.findByLogin(user.getLogin());
		if (userlist.isEmpty()) {
			this.userDAO.update(user);
			return SaveUserCode.OK;
		} else {
			if (userlist.get(0).getUserId() == user.getUserId()) {
				this.userDAO.update(user);
				return SaveUserCode.OK;
			} else
				return SaveUserCode.LOGIN_IN_USE;
		}
	}

	public void deleteUser(int userId) throws Exception {
		this.userDAO.delete(userId);
	}

	public List<UserDTO> getAllUsersList() throws Exception {
		List<UserDTO> result = new ArrayList<UserDTO>(this.userDAO.listUser());
		return result;
	}

	public boolean loginAlreadyInUse(String login) {
		List<UserDTO> user = this.userDAO.findByLogin(login);
		if (user.isEmpty())
			return true;
		else
			return false;
	}
}
